package com.leenmvc.core.dao.iotdb;

import com.leenmvc.core.dao.iotdb.domain.TimeseriesDomain;
import org.apache.iotdb.tsfile.read.common.Field;

import java.util.List;
import java.util.Map;
import java.util.Set;

public interface IotDBDao {

    /**
     * 根据设备Id创建存储组
     * 创建存储组
     * @param storageGroupName 存储组名称
     * @return 是否成功
     */
    void setStorageGroup(String storageGroupName);


    /**
     * 通过时间序列实体来帮IOTDB建立时间序列
     * 创建时间序列字段
     * @param storageGroup 存储组
     * @param timeseriesDomain 时间序列实体，存储时间序列信息
     * @param deviceId 设备Id 用来标识在存储组
     * @return 是否成功
     */
    void createTimeseries(String storageGroup, TimeseriesDomain timeseriesDomain, Long deviceId);

    /**
     * 单台设备批量保存时间序列
     * @param storageGroup 存储组
     * @param timeseriesDomains 时间序列集合
     * @param deviceId 设备Id
     * @return
     */
    void batchCreateTimeseries(String storageGroup, List<TimeseriesDomain> timeseriesDomains, Long deviceId);



    /**
     * 插入单台设备数据，服务器需要做类型推断
     * @param deviceId 设备Id 用来标识在存储组
     * @param map 单台设备插入
     * @return 是否成功
     */
    void insert(String groupName, Long deviceId, long time, Map<String,Object> map);


    /**
     * 插入单台设备数据，服务器不需要做类型推断
     * @param deviceId 设备Id 用来标识在存储组
     * @param list 每个map中对应，测点：测点值：测点类型
     * @return 是否成功
     */
    void insert(String groupName, Long deviceId, long time, List<TimeseriesDomain> list);

    /**
     * 通一采集时间插入多条设备数据
     * @param groupName 设备组
     * @param deviceIds 设备id列表，与maps对应
     * @param time      采集时间
     * @param maps      采集数据
     */
    void  batchInset(String groupName, List<String> deviceIds, long time,List<Map<String,String>> maps);


    /**
     * 查询设备的最新的一条数据
     * @param groupName 存储组name
     * @param deviceId 设备ID
     * @param params   设备参数set
     * @return 最新的一条数据
     */
    Map<String,Object> getLastData(String groupName, Long deviceId, Set<String> params);

    /**
     * 获取设备某个字段某一时间段第一条非空数据
     * @param groupName 存储组name
     * @param deviceId 设备ID
     * @param filedName  字段名称
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param isLast    是否是最后一条，否则第一条
     * @return
     */
    Object getFirstOrLastValue(String groupName, Long deviceId,String filedName,long startTime,long endTime,boolean isLast);



    /**
     * 根据设备Id查询设备信息
     *
     * @param deviceId
     * @return List<时间序列Map> key: 时间序列名称  , value:时间序列属性值
     */
//    List<Map<String, Object>> getDataByDeviceId(String deviceId);


    /**
     * 根据设备Id查询该存储组下的时间序列
     *
     * @param deviceId
     * @return List<TimeseriesDomain>
     */
//    List<TimeseriesDomain> getTimeseriesByDeviceId(String deviceId);


    /**
     * 查询所有存储组信息
     */
    List<Field> showStorageGroup();


    /**
     * 根据时间序列，设备Id，和拼装好的Json来插入一条数据
     * @param deviceId
     * @param dataJson
     * @eample {
     * 			"t": "2020-04-01 14:42:58.802",
     * 			"status": 1,
     * 			"温度": "27",
     * 			"湿度": "80",
     * 			"X": 0.0,
     * 			"V": 1,
     * 			"Y": 0.0
     *         }
     * --> 保证里面的属性，本来就在IOTDB里面存在时间序列(除t)
     * @return
     */
//    Boolean save(String deviceId, JSONObject dataJson);

    /**
     * 通过查询条件查询时间序列
     * @param deviceId 设备Id
     * @param wrapper 组装查询条件
     * @return List<时间序列Map> key: 时间序列名称  , value:时间序列属性值
     */
//    List<TimeseriesDomain> getTimeseries(String deviceId, Wrapper wrapper);


    /**
     * 通过设备Id和wrapper
     * @param iotWrapper 组装条件
     * @return
     */
//    List<Map<String,Object>> getCount(BaseIotWrapper iotWrapper);

    /**
     * 查询某时间序列最大值
     * @param deviceId
     * @param timeseriesName
     * @return
//     */
//    List<Map<String,Object>> getMaxValue(String deviceId,String timeseriesName);
//
//
//    /**
//     * 查询某时间序列最小值
//     * @param deviceId
//     * @param timeseriesName
//     * @return
//     */
//    List<Map<String,Object>> getMinValue(String deviceId,String timeseriesName);
//
//
//    /**
//     * 查询某时间序列插入时间最小值
//     * @param deviceId
//     * @param timeseriesName
//     * @return
//     */
//    List<Map<String,Object>> getMinTime(String deviceId,String timeseriesName);
//
//
//    /**
//     * 查询某时间序列插入时间最大值
//     * @param deviceId
//     * @param timeseriesName
//     * @return
//     */
//    List<Map<String,Object>> getMaxTime(String deviceId,String timeseriesName);
//
//
//    /**
//     * 根据wrapper查询数据
//     * @param wrapper 查询条件
//     * @return
//     */
//    List<Map<String,Object>> getDataByWrapper(IotQueryWrapper wrapper);
//
//
//    /**
//     * 根据wrapper 查询数据， 封装成实体返回
//     * @param wrapper
//     * @param clz
//     * @return
//     */
//    List<?> getDataByWrapper(IotQueryWrapper wrapper , Class<?> clz);
//
//
//    /**
//     * 根据sql 语句去查询数据
//     * @param sql
//     * @return
//     */
//    List<Map<String,Object>> getBySql(String sql);
//
//



}
